<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
    <style>
        body {
            padding: 5px;
        }

        * {
            padding: 0;
            margin: 0;
        }

        img {
            vertical-align: top;
        }

        li {
            list-style: none;
        }

        a {
            text-decoration: none;
            color: inherit;
        }

        /* 计数框 */
        .countInput {
            height: 40px;
            line-height: 40px;
            text-align: center;
            display: inline-flex;
            border-radius: 2px;
            overflow: hidden;
        }

        .countInput .reduce,
        .countInput .add {
            width: 40px;
            background-color: #CCCCCC;
            color: #666666;
        }

        .countInput .input {
            width: 100px;
            outline: none;
            border: 1px solid #CCCCCC;
            text-align: center;
        }
    </style>
</head>

<body>
    <!-- vue的根实例(所有组件的父(代)组件) -->
    <div id="app">
        <h3>组件prop测试</h3>
        <div>
            <p>
                {{count}}
            </p>
            <button @click="count++">点击</button>
        </div>
        <br>
        <br>
        <br>

        <!-- 1. 父组件给子组件绑定自定义事件update:value,携带了事件触发时执行的函数(updateValueHandler 引用类型)  -->
        <count-input :value="count" @update:value="updateValueHandler"></count-input>

    </div>
</body>
<template id="countInput">
    <div class="countInput">
        <span class="reduce" @click="value>1 && $emit('update:value', value-1)">-</span>
        <input class="input" :value="value" @change="changeFn" type="text">
        <span class="add" @click="$emit('update:value', value+1)">+</span>
    </div>
</template>
<script>




    // 添加子组件和父组件的通信手段  (不能违背单向数据流的原则 父组件可以修改子组件,子组件无法修改父组件上的数据)
    // 1. 父组件给子组件绑定自定义事件changeCount,携带了事件触发时执行的函数(引用类型) 
    // 2. 子组件接收父组件传递的自定义事件($listeners),对应自定义事件的名称获取函数 => 触发 this.$emit("xxx",参数)



    Vue.component("count-input", {
        props: {
            value: {
                type: Number,
                default: 1,
            }
        },
        data() {
            return {

            }
        },
        methods: {
            changeFn(e) {
                console.log(e.target.value);
                var val = e.target.value;
                if (isNaN(val) && val % 1 == 0) {  // 正整数
                    this.$emit("update:value", parseInt(val))
                } else {
                    this.$emit("update:value", parseInt(val));
                    this.$forceUpdate();
                }
            }
        },
        watch: {
            // value: function (newVal, oldVal) {
            //     console.log("value改变", newVal, oldVal);
            // }
        },
        template: "#countInput",
        mounted() {

            // 子组件接收父组件传递的自定义事件($listeners),对应自定义事件的名称获取函数=>触发
            // console.log("子组件加载完毕", this);
            console.log("子组件加载完毕", this.$listeners);
            // console.log("子组件加载完毕", this.$listeners["update:value"]
            // );

            // 触发接收的自定义事件
            // 写法1:  low
            // this.$listeners["update:value"](100)

            // 写法2:   子组件的实例 通过$emit("eventName") 触发
            // this.$emit("update:value", 100);
        }
    })

    var vm = new Vue({
        el: "#app",
        data: {
            count: 1,
        },
        methods: {
            updateValueHandler(v) {
                console.log("自定义事件触发", v);
                this.count = v;
            }
        },
        mounted() {

        },
    })





</script>

</html>